Extracción de Datos (Web Scraping) ⛏️
El primer desafío fue obtener los datos sísmicos de una fuente confiable. La mejor opción es el Centro Sismológico Nacional (CSN) de la Universidad de Chile (sismologia.cl). El objetivo era crear un script en Python que pudiera "leer" la tabla de "Últimos Sismos" de su página principal de forma automática.
Herramientas Utilizadas
- Python: El lenguaje de programación base.
- Requests: Para hacer peticiones HTTP y descargar el contenido HTML de la página.
- BeautifulSoup: Para "parsear" (analizar) el HTML y navegar por su estructura para encontrar los datos.
- Pandas: Para organizar los datos extraídos en una tabla (DataFrame) fácil de manipular.
⠀
Proceso de Scraping
- 1 Descargar el HTML: El script primero se conecta a https://sismologia.cl y descarga todo su código fuente.
- 2 Analizar el HTML: Se crea un objeto BeautifulSoup que convierte el texto HTML en una estructura navegable.
- 3 Encontrar la Tabla: Usando el método find(), busqué la tabla específica que contenía los datos. Al inspeccionar el código de la página, descubrí que tenía la clase sismologia.
- 4 Iterar y Extraer: El script recorre cada fila (
) de la tabla (ignorando la primera, que es el encabezado) y extrae el texto de cada celda ( ). - 5 Limpieza de Datos: La primera celda contenía la fecha y el lugar juntos, separados por un salto de línea (
). Usé get_text(separator='|') para reemplazar ese salto por un carácter | y luego str.split('|') con Pandas para separar esa columna en dos: "Fecha Local" y "Lugar".⠀
Código Final de Scraping
Python
import requests from bs4 import BeautifulSoup import pandas as pd def obtener_ultimo_sismo_df(): url = 'https://sismologia.cl' try: response = requests.get(url) response.raise_for_status() except requests.exceptions.RequestException: return None soup = BeautifulSoup(response.text, 'html.parser') tabla_sismos = soup.find('table', class_='sismologia') if not tabla_sismos: return None primera_fila = tabla_sismos.find_all('tr')[1] if not primera_fila: return None celdas = primera_fila.find_all('td') fecha_lugar = celdas[0].get_text(separator='|', strip=True) profundidad = celdas[1].get_text(strip=True) magnitud = celdas[2].get_text(strip=True) df = pd.DataFrame([[fecha_lugar, profundidad, magnitud]], columns=['Fecha Local / Lugar', 'Profundidad', 'Magnitud']) df[['Fecha Local', 'Lugar']] = df['Fecha Local / Lugar'].str.split('|', n=1, expand=True) return df[['Fecha Local', 'Lugar', 'Profundidad', 'Magnitud']] - 5 Limpieza de Datos: La primera celda contenía la fecha y el lugar juntos, separados por un salto de línea (